package com.skyd.core.android.game;

import android.graphics.Canvas;
import android.graphics.Matrix;

import com.skyd.core.vector.Vector2DF;

/**
 * 处于根节点的GameObject，其默认显示状态为flase，以避免未加载完毕时执行绘制操作产生异常
 * 
 * @author SkyD
 * 
 */
public abstract class GameRootObject extends GameObject {

	public GameRootObject() {
		super();
		getSize().reset(100, 100);
		setVisible(false);
	}

	/**
	 * 初始值为true。 功能注释：指示是否填满整个游戏显示区域（View）
	 */
	private boolean _IsFillParentDisplayArea = true;

	/**
	 * 获取IsFillParentDisplayArea。 功能注释：指示是否填满整个游戏显示区域（View）
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsFillParentDisplayArea() {
		return _IsFillParentDisplayArea;
	}

	/**
	 * 设置IsFillParentDisplayArea。 功能注释：指示是否填满整个游戏显示区域（View）
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsFillParentDisplayArea(boolean value) {
		_IsFillParentDisplayArea = value;
	}

	/**
	 * 设置IsFillParentDisplayArea为其默认值(true)。 功能注释：指示是否填满整个游戏显示区域（View）
	 */
	public void setIsFillParentDisplayAreaToDefault() {
		setIsFillParentDisplayArea(true);
	}

	/**
	 * 初始值为null。 功能注释：所属游戏显示区域
	 */
	private IGameDisplayArea _ParentDisplayArea = null;

	/**
	 * 获取ParentDisplayArea。 功能注释：所属游戏显示区域
	 * 
	 * @return 当前的GameDisplayArea类型的值
	 */
	public IGameDisplayArea getParentDisplayArea() {
		return _ParentDisplayArea;
	}

	/**
	 * 设置ParentDisplayArea。 功能注释：所属游戏显示区域
	 * 
	 * @param value
	 *            要设置的GameDisplayArea类型值
	 */
	protected void setParentDisplayArea(IGameDisplayArea value) {
		_ParentDisplayArea = value;
	}

	/**
	 * 设置ParentDisplayArea为其默认值(null)。 功能注释：所属游戏显示区域
	 */
	protected void setParentDisplayAreaToDefault() {
		setParentDisplayArea(null);
	}

	@Override
	public GameObject getParent() {
		return null;
	}

	@Override
	public void setParent(GameObject value) throws GameException {
		throw new GameException(this, "此为根对象，不能设置父对象", null);
	}

	@Override
	public GameObject getDisplayContentChild() {
		return null;
	}

	/**
	 * 初始值为new Vector2DF(0,0)。 功能注释：显示区域实际尺寸
	 */
	private Vector2DF _DisplayAreaSize = new Vector2DF(0, 0);

	/**
	 * 获取DisplayAreaSize。 功能注释：显示区域实际尺寸
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getDisplayAreaSize() {
		return _DisplayAreaSize;
	}

	/**
	 * 设置DisplayAreaSize。 功能注释：显示区域实际尺寸
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	protected void setDisplayAreaSize(Vector2DF value) {
		_DisplayAreaSize = value;
	}

	/**
	 * 设置DisplayAreaSize为其默认值(new Vector2DF(0,0))。 功能注释：显示区域实际尺寸
	 */
	protected void setDisplayAreaSizeToDefault() {
		setDisplayAreaSize(new Vector2DF(0, 0));
	}

	/**
	 * 初始值为new Vector2DF(480,800)。 功能注释：显示区域基准尺寸
	 */
	private Vector2DF _StandardDisplayAreaSize = new Vector2DF(480, 800);

	/**
	 * 获取StandardDisplayAreaSize。 功能注释：显示区域基准尺寸
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getStandardDisplayAreaSize() {
		return _StandardDisplayAreaSize;
	}

	/**
	 * 设置StandardDisplayAreaSize。 功能注释：显示区域基准尺寸
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	public void setStandardDisplayAreaSize(Vector2DF value) {
		_StandardDisplayAreaSize = value;
	}

	/**
	 * 设置StandardDisplayAreaSize为其默认值(new Vector2DF(480,800))。 功能注释：显示区域基准尺寸
	 */
	public void setStandardDisplayAreaSizeToDefault() {
		setStandardDisplayAreaSize(new Vector2DF(480, 800));
	}

	/**
	 * 初始值为new Vector2DF(1,1)。 功能注释：显示区域缩放参考值，1为100%
	 */
	private Vector2DF _DisplayAreaFixScaleReferenceValue = new Vector2DF(1, 1);;

	/**
	 * 获取DisplayAreaFixScaleReferenceValue。 功能注释：显示区域缩放参考值，1为100%
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getDisplayAreaFixScaleReferenceValue() {
		return _DisplayAreaFixScaleReferenceValue;
	}

	/**
	 * 设置DisplayAreaFixScaleReferenceValue。 功能注释：显示区域缩放参考值，1为100%
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	protected void setDisplayAreaFixScaleReferenceValue(Vector2DF value) {
		_DisplayAreaFixScaleReferenceValue = value;
	}

	/**
	 * 设置DisplayAreaFixScaleReferenceValue为其默认值(new Vector2DF(1,1))。
	 * 功能注释：显示区域缩放参考值，1为100%
	 */
	protected void setDisplayAreaFixScaleReferenceValueToDefault() {
		setDisplayAreaFixScaleReferenceValue(new Vector2DF(1, 1));
	}

	@Override
	public boolean onUpdating() {
		updateDisplayAreaSize();
		updateDisplayAreaScaleReferenceValue();
		return super.onUpdating();
	}

	/**
	 * 更新当前的显示区域缩放参考值
	 */
	protected void updateDisplayAreaScaleReferenceValue() {
		Vector2DF d = _DisplayAreaSize;
		Vector2DF s = _StandardDisplayAreaSize;
		float xs = d.getX() * 1.00f / s.getX();
		float ys = d.getY() * 1.00f / s.getY();
		if(_IsFillParentDisplayArea)
		{
			_DisplayAreaFixScaleReferenceValue.reset(xs, ys);
		}
		else{
			if(_IsMatchHeight&&_IsMatchWidth){
				float min = Math.min(xs, ys);
				_DisplayAreaFixScaleReferenceValue.reset(min, min);
			}
			else if(_IsMatchHeight){
				_DisplayAreaFixScaleReferenceValue.reset(ys, ys);
			}
			else _DisplayAreaFixScaleReferenceValue.reset(xs, xs);
		}
	}

	/**
	 * 更新当前的显示区域实际尺寸
	 */
	protected void updateDisplayAreaSize() {
		_DisplayAreaSize.setX(getParentDisplayArea().getWidth());
		_DisplayAreaSize.setY(getParentDisplayArea().getHeight());
	}

	/**
	 * 初始值为true。
	 * 功能注释：指示是否将基准宽度匹配到实际宽度，高度跟随此比例进行缩放（如果同时匹配了高度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 */
	private boolean _IsMatchWidth = true;

	/**
	 * 获取IsMatchWidth。
	 * 功能注释：指示是否将基准宽度匹配到实际宽度，高度跟随此比例进行缩放（如果同时匹配了高度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsMatchWidth() {
		return _IsMatchWidth;
	}

	/**
	 * 设置IsMatchWidth。
	 * 功能注释：指示是否将基准宽度匹配到实际宽度，高度跟随此比例进行缩放（如果同时匹配了高度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsMatchWidth(boolean value) {
		_IsMatchWidth = value;
	}

	/**
	 * 设置IsMatchWidth为其默认值(true)。
	 * 功能注释：指示是否将基准宽度匹配到实际宽度，高度跟随此比例进行缩放（如果同时匹配了高度，则以两者的最小比例为准
	 * 。如果指定了填满整个区域，则此属性无意义）
	 */
	public void setIsMatchWidthToDefault() {
		setIsMatchWidth(true);
	}

	/**
	 * 初始值为true。
	 * 功能注释：指示是否将基准高度匹配到实际高度，宽度跟随此比例进行缩放（如果同时匹配了宽度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 */
	private boolean _IsMatchHeight = true;

	/**
	 * 获取IsMatchHeight。
	 * 功能注释：指示是否将基准高度匹配到实际高度，宽度跟随此比例进行缩放（如果同时匹配了宽度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsMatchHeight() {
		return _IsMatchHeight;
	}

	/**
	 * 设置IsMatchHeight。
	 * 功能注释：指示是否将基准高度匹配到实际高度，宽度跟随此比例进行缩放（如果同时匹配了宽度，则以两者的最小比例为准。如果指定了填满整个区域
	 * ，则此属性无意义）
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsMatchHeight(boolean value) {
		_IsMatchHeight = value;
	}

	/**
	 * 设置IsMatchHeight为其默认值(true)。
	 * 功能注释：指示是否将基准高度匹配到实际高度，宽度跟随此比例进行缩放（如果同时匹配了宽度，则以两者的最小比例为准
	 * 。如果指定了填满整个区域，则此属性无意义）
	 */
	public void setIsMatchHeightToDefault() {
		setIsMatchHeight(true);
	}
	
	/**
	 * 位置转换，默认返回传入坐标的克隆值，可以通过重写此方法实现坐标位置的变换，通常用于改变屏幕的坐标原点位置
	 * @param v 待转换的值
	 * @return 转换后的值
	 */
	public Vector2DF transitionPosition(Vector2DF v){
		return v.getClone();
	}

	@Override
	public GameRootObject getRoot() {
		return this;
	}

	@Override
	protected void operateCanvas(Canvas c) {

	}
	
	

	@Override
	protected void operateCanvasForParentAbsoluteSize(Canvas c) {

	}

	@Override
	protected void operateMatrixForParentAbsoluteSize(Matrix m) {

	}

//	@Override
//	protected Vector2DF operatePoint(Vector2DF AngularPoint, Vector2DF Center) {
//		return AngularPoint;
//	}
//
//	@Override
//	protected Vector2DF combinationAngularPoint(Vector2DF subAngularPoint) {
//		return subAngularPoint;
//	}
	
	
}
